﻿using System;
using System.Data;
using System.Reflection;
namespace HZ.Data
{
    /// <summary>
    /// DataHelper的接口
    /// </summary>
    public interface IDbHelper
    {
        /// <summary>
        /// 关闭数据库连接(已过期，目前无需执行)
        /// </summary>
        void Close();
        /// <summary>
        /// 执行一个T-SQL (不返回结果集)
        /// </summary>
        /// <param name="cmdText">T-SQL 命令</param>
        /// <returns>返回一个 int 表示这个命令所影响的行数</returns>
        int ExecuteNonQuery(string cmdText);
        /// <summary>
        ///执行一个T-SQL命令(可以含参数)(不返回结果集) 
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="commandType">命令类型 (存储过程, 文本, 等)</param>
        /// <param name="commandText">存储过程名称 or T-SQL 命令</param>
        /// <param name="commandParameters">一组用于执行该命令的参数</param>
        /// <returns>返回执行这个命令所影响的行数</returns>
        int ExecuteNonQuery(System.Data.CommandType commandType, string commandText, params IDataParameter[] commandParameters);
        /// <summary>
        /// 执行一个T-SQL命令(返回结果集)
        /// </summary>
        /// <param name="cmdText">T-SQL 命令</param>
        /// <returns>返回一个System.Data.IDataReader</returns> 
        System.Data.IDataReader ExecuteReader(string cmdText);
        /// <summary>
        /// 执行一个T-SQL命令(返回结果集)
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks> 
        /// <param name="commandType">命令类型(存储过程, 文本, 等)</param>
        /// <param name="commandText">存储过程名称 or T-SQL 命令</param>
        /// <param name="commandParameters">一组用于执行该命令的参数</param>
        /// <returns>一个包含查询结果的 DataReader</returns>
        System.Data.IDataReader ExecuteReader(System.Data.CommandType commandType, string commandText, params IDataParameter[] commandParameters);
        /// <summary>
        /// 执行一个命令(返回结果集的第一行第一列结果)
        /// </summary>
        /// <param name="cmdText">T-SQL 命令</param>
        /// <returns>返回一个可以转换成预期类型的object对象</returns>
        object ExecuteScalar(string cmdText);
        /// <summary>
        /// 执行一个命令(返回结果集的第一行第一列结果)
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        /// </remarks> 
        /// <param name="commandType">命令类型(存储过程, 文本, 等)</param>
        /// <param name="commandText">存储过程名称 or T-SQL 命令</param>
        /// <param name="commandParameters">一组用于执行该命令的参数</param>
        /// <returns>返回一个可以转换成预期类型的object对象</returns>
        object ExecuteScalar(System.Data.CommandType commandType, string commandText, params IDataParameter[] commandParameters);
        /// <summary>
        /// 执行一个T-SQL命令(返回一个DataTable)
        /// </summary>
        /// <param name="cmdText">T-SQL 命令</param>
        /// <returns>返回包含结果的DataTable </returns>
        System.Data.DataTable ExecuteTable(string cmdText);
        /// <summary>
        /// 执行一个T-SQL命令(返回一个DataTable)
        /// </summary>
        /// <param name="cmdType">命令类型(存储过程, 文本, 等)</param>
        /// <param name="cmdText">存储过程名称 or T-SQL 命令</param>
        /// <param name="commandParameters">一组用于执行该命令的参数</param>
        /// <returns>返回包含结果的DataTable</returns>
        System.Data.DataTable ExecuteTable(System.Data.CommandType cmdType, string cmdText, params IDataParameter[] commandParameters);
        /// <summary>
        /// 执行一个T-SQL命令(返回一个DataSet)
        /// </summary>
        /// <param name="cmdText">T-SQL 命令</param>
        /// <returns>返回一个 DataSet</returns>
        System.Data.DataSet ExecuteDataSet(string cmdText);
        /// <summary>
        /// 执行一个T-SQL命令(返回一个DataSet)
        /// </summary>
        /// <param name="cmdType">命令类型(存储过程, 文本, 等)</param>
        /// <param name="cmdText">存储过程名称 or T-SQL 命令</param>
        /// <param name="commandParameters">一组用于执行该命令的参数</param>
        /// <returns>返回一个 DataSet</returns>
        System.Data.DataSet ExecuteDataSet(System.Data.CommandType cmdType, string cmdText, params IDataParameter[] commandParameters);
    }
    /// <summary>
    /// 数据库帮助类工厂
    /// </summary>
    public abstract class DbHelperFactory
    {
        /// <summary>
        /// 创建一个数据库帮助类
        /// </summary>
        /// <returns>数据库帮助类接口</returns>
        public static IDbHelper Create()
        {
            string dbtype = System.Configuration.ConfigurationManager.AppSettings["DataBaseType"];
            IDbHelper helper = null;
            if (string.IsNullOrEmpty(dbtype))
            {
                helper = new SQLHelper();
            }
            else
            {
                switch (dbtype)
                {
                    case "SQLServer":
                        helper = new SQLHelper();
                        break;
                    case "Access":
                        helper = new OledbHelper();
                        break;
                    case "Oracle":
                        helper = new OracleHelper();
                        break;
                    default:
                        throw new Exception("这个方法尚未实现");
                    // break;
                }
            }
            return helper;
        }
    }
}
